package com.example.demo.designPhilosophy.isp;
/**
* @description: TODO
* @author yangzhenyu
* @date 2022/2/17 10:42
* @version 1.0
*/
public interface A {
    void method1();
    void method2();
    void method3();
    void method4();
    void method5();
}

//实际场景中使用的方法
class B{
    public void method1(A  a){
        a.method1();
    }
    public void method2(A  a){
        a.method2();
    }
    public void method3(A  a){
        a.method3();
    }
}

//违反接口隔离原则，违反点就出现这个地方，实现A接口方法的实现类，必须要将1、2、3、4、5个方法都实现
//而实际场景中根本就没有用到4、5 方法，所以这个接口A设计的时候方法就有臃肿，就不是最小接口，因此违反原则

class C implements A{
    @Override
    public void method1() {
        System.out.println("method1");
    }
    @Override
    public void method2() {
        System.out.println("method2");
    }
    @Override
    public void method3() {
        System.out.println("method3");
    }
    @Override
    public void method4() {    }
    @Override
    public void method5() {    }
}

//如何修改： 将A接口拆分成两个接口，根据实际需求，选择对应的那个接口进行传参，
// 这样实现类就可以避免实现多余的方法，符合接口隔离原则

interface A1{
    void method1();
    void method2();
    void method3();
}

interface A2{
    void method3();
    void method4();
}

//使用的时候，直接使用 A1接口即可，如下:

class D {
    public void method1(A1  a){
        a.method1();
    }
    public void method2(A1  a){
        a.method2();
    }
    public void method3(A1  a){
        a.method3();
    }
}

//这样实现类，继承A1即可，不会造成多余的浪费
class E implements A1{
    @Override
    public void method1() {
        System.out.println("method1");
    }
    @Override
    public void method2() {
        System.out.println("method2");
    }
    @Override
    public void method3() {
        System.out.println("method3");
    }
}